package cn.ljy.authority.service;

import cn.ljy.authority.model.SysUser;

/**
 * 专门用于处理移动端用户的token
 * 规则：
 * 1.与Pc端的设计不同，移动端的存储多了一个登录端的保存。如登录端是app还是Pc
 * @author ljy
 * 20221113
 */
public interface SysUserTokenFrontendService {

    /**
     * 通过账户名和密码查找符合的账户数量,如果登录成功，将token返回，并存储到redis里面
     * redis中存储规则：key(表头+token)->client
     * 说明：
     * 1.如果用户还没有登录过，则直接生成新的token，并记录登录的类型，存储到系统中
     * 2.如果该用户已经在某个前台登录，此时根据系统设置来决定token的存储业务
     *（1）如果允许用户在多个前台同时登录，则按照规则直接生成新的token存储；如果不允许，则先移除之前用户在redis中存储的所有信息，再重新生成token存储在redis中
     *（2）如果允许用户在相同类型的前台同时登录（例如两个移动端同时登录），则按照规则直接生成新的token存储；如果不允许，则先移除之前用户在redis中存储的与当前登录相同前端类型的所有登录信息，再重新生成token存储在redis中
     * 注意：pc端、移动端，不算入相同类型前台。
     * @param username 账户名
     * @param password 密码
     * @param client 客户端：移动端:mobile，pc端：pc,平板端：ipad(待定)
     * @return token不为null即表示登录成功
     */
    String loginAndGetToken(String username,String password,String client);


    /**
     * 检查token是否过期，如果过期抛出异常；如果不过期则刷新该token在redis的时间
     * @param token
     */
    void verifyAndRefreshUserToken(String token);

    /**
     * 从redis中移除用户相应的token
     * 说明：
     * 1.设计规则：根据用户的id在redis中找到用户token并删除。
     * 2.补充：如果前端有多个，注销只影响一个端，则这里需要改为根据token删除
     * @param token
     */
    void removeUserToken(String token);

    /**
     * 从token中读取账户信息
     * @param token
     * @return 账户信息
     */
    SysUser getUserFromToken(String token);

    /**
     * 从token中读取账户的主键
     * @param token
     * @return 账户信息
     */
    Long getUserIdFromToken(String token);


}
